package com.liuqing.www.phone.server.底层消息;

import java.io.IOException;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.nio.channels.ClosedChannelException;

import org.xsocket.MaxReadSizeExceededException;
import org.xsocket.connection.IConnectHandler;
import org.xsocket.connection.IDataHandler;
import org.xsocket.connection.IDisconnectHandler;
import org.xsocket.connection.INonBlockingConnection;
import org.xsocket.datagram.IDatagramHandler;
import org.xsocket.datagram.IEndpoint;

import com.gwsoft.logic.user.OnlineUser;
import com.gwsoft.server.SessionManager;

/**
 * @author 作者姓名 E-mail: email地址
 * @version 创建时间：2010-11-17 下午12:30:32
 * @info
 * 第1~4字节  用字节数表示的消息头的长度（13）
 * 第5~8字节  用字节数表示的消息内容长度 （例如：30）
 * 第9字节  服务类型：1为响应，2为请求
 * 第10~11字节 源系统代号   （例如：ab）
 * 第12~13字节 目的系统代号  （例如：cd） 
 *	
 */

/**
 * 固定长度 13
 *  消息序列号	4字节
 *	消息指令号	4字节
 *	消息版本		2字节
 *	消息信息 		加密，压缩	1字节 0-无处理 1-加密 2-压缩
 *	消息体长度	2字节
 *	消息内容	消息长度
 *
 */
public class DataHandler implements IDataHandler,IConnectHandler,IDisconnectHandler {
	
	
	/* (non-Javadoc)
	 * @see org.xsocket.connection.IDataHandler#onData(org.xsocket.connection.INonBlockingConnection)
	 */
	@Override
	public boolean onData(INonBlockingConnection nbc)
			throws IOException, BufferUnderflowException,
			ClosedChannelException, MaxReadSizeExceededException {
		if(nbc.isOpen() && nbc.available() > 0 ){
			try{
				this.nbc = nbc ;
				recevieData(nbc) ;
				sendData() ;
				
			}catch (Exception e) {
				e.printStackTrace() ;
			}
		}
		return true;
	}
	
	@Override
	public boolean onConnect(INonBlockingConnection nbc)
			throws IOException, BufferUnderflowException,
			MaxReadSizeExceededException {
		String ip = nbc.getRemoteAddress().getHostAddress() ;
		System.out.println("remoteName "+ip +" has connected ！"); 
		
		if(SessionManager.isIpConn(ip)){
			System.out.println("关闭已有ip连接: " + ip);
			nbc.close() ;
			return false ;
		}
//		SessionMananger.putIpSid(ip, nbc.getId()) ;
//		OnlineUser oluser = new OnlineUser(ip ,this);
		SessionManager.putHandlerSession(nbc.getId(), nbc) ;
		System.out.println("当前连接数量: " + SessionManager.onlineSize());
		return true;
	}

	@Override
	public boolean onDisconnect(INonBlockingConnection nbc)
			throws IOException {
		SessionManager.clearSessionBySid(nbc.getId()) ;
		System.out.println("onDisconnect");
		
		return true;
	}
	private INonBlockingConnection nbc = null ;
	
	private byte[] sendPack = null ;
	
	public void sendData(){
		try {
			if(sendPack != null){
				DataSender send = new DataSender(nbc ,sendPack) ;
			}
			
		} catch (BufferOverflowException e) {
			e.printStackTrace();
		}
		
	}
	
	DataPackReceive dataReceive = null ;
	public void recevieData(INonBlockingConnection nbc){
		try {
			int size = nbc.available();
//			System.out.println("<<<<<: "+size);
			byte[] pack = nbc.readBytesByLength(size) ;
//			System.out.println("****接收到时间**********" + System.currentTimeMillis());
			dataReceive = new DataPackReceive(nbc.getId() ,pack) ;
			sendPack = dataReceive.getReturnData() ;
//			dm.close() ;
		} catch (BufferOverflowException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public byte[] getSendPack() {
		return sendPack;
	}

	public void setSendPack(byte[] sendPack) {
		this.sendPack = sendPack;
	}

	public INonBlockingConnection getNbc() {
		return nbc;
	}

	public void setNbc(INonBlockingConnection nbc) {
		this.nbc = nbc;
	}

	
}
